package com.rchat.pocmini.message;

import com.airtalkee.sdk.AirtalkeeMessage;
import com.airtalkee.sdk.OnMessageListener;
import com.airtalkee.sdk.OnMessagePttListener;
import com.airtalkee.sdk.entity.AirContact;
import com.airtalkee.sdk.entity.AirMessage;
import com.airtalkee.sdk.entity.AirSession;

import java.util.List;

/**
 * Created by ljd on 2017/2/6.
 * <p>
 * 负责用户之间即时消息传递
 * <p>
 * OnMessageListener ，返回与用户消息相关的事件，关心此类事件的实例需实现此Interface才会被调用
 */

public class PocAirtalkeeMessage implements PocAirtalkeeMessageInterface {
    private static AirtalkeeMessage airtalkeeMessage = AirtalkeeMessage.getInstance();
    private static PocAirtalkeeMessage pocAirtalkeeMessage;


    //========== MESSAGE状态值 ==========//
    //无状态
    public static final int STATE_NONE = AirMessage.STATE_NONE;
    //正在传输资源数据
    public static final int STATE_RES_DOING = AirMessage.STATE_RES_DOING;
    //资源传输失败
    public static final int STATE_RES_FAIL = AirMessage.STATE_RES_FAIL;
    //正在发送消息
    public static final int STATE_SENDING = AirMessage.STATE_SENDING;
    //发送成功
    public static final int STATE_RESULT_OK = AirMessage.STATE_RESULT_OK;
    //发送失败
    public static final int STATE_RESULT_FAIL = AirMessage.STATE_RESULT_FAIL;

    private PocAirtalkeeMessage() {
    }

    /**
     * 获取AirtalkeeMessage实例
     *
     * @return airtalkeeMessage
     */
    public static PocAirtalkeeMessage getPocAirtalkeeMessageInstance() {
        if (pocAirtalkeeMessage == null) {
            pocAirtalkeeMessage = new PocAirtalkeeMessage();
        }
        return pocAirtalkeeMessage;
    }

    /**
     * 注册监听器，关心OnMessageListener事件的实例，均需要通过此接口注册，
     * 否则将收不到相应事件
     *
     * @param listener 监听器
     */
    @Override
    public void setOnMessageListener(OnMessageListener listener) {
        airtalkeeMessage.setOnMessageListener(listener);
    }

    /**
     * 设置语音本地缓存文件存放路径
     *
     * @param recordPath 文件存放路径
     */
    @Override
    public void setMessageRecordPath(String recordPath) {
        airtalkeeMessage.setMessageRecordPath(recordPath);
    }

    /**
     * 发送用户即时消息（指定Session发送即时消息），事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param session          所在会话的Session实例
     * @param body             支持普通文本消息：isCustom为true时body可以是json形式的自定义报文
     * @param isCustom         是否为自定义消息
     * @param allowOfflineSend 是否允许离线发送
     * @return AirMessage
     */
    @Override
    public AirMessage messageSend(AirSession session, String body, boolean isCustom, boolean allowOfflineSend) {
        return airtalkeeMessage.MessageSend(session, body, isCustom, allowOfflineSend);
    }

    /**
     * 发送用户即时消息（指定用户列表发送即时消息），事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param contacts         指定用户列表作为消息发送目标
     * @param body             支持普通文本消息：isCustom为true时body可以是json形式的自定义报文
     * @param isCustom         是否为自定义消息
     * @param allowOfflineSend 是否允许离线发送
     * @return AirMessage
     */
    @Override
    public AirMessage messageSend(List<AirContact> contacts, String body, boolean isCustom, boolean allowOfflineSend) {
        return airtalkeeMessage.MessageSend(contacts, body, isCustom, allowOfflineSend);
    }

    /**
     * 发送用户即时消息（指定用户发送即时消息），事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param contact          指定某一个用户作为消息发送目标
     * @param body             支持普通文本消息：isCustom为true时body可以是json形式的自定义报文
     * @param isCustom         是否为自定义消息
     * @param allowOfflineSend 是否允许离线发送
     * @return AirMessage
     */
    @Override
    public AirMessage messageSend(AirContact contact, String body, boolean isCustom, boolean allowOfflineSend) {
        return airtalkeeMessage.MessageSend(contact, body, isCustom, allowOfflineSend);
    }

    /**
     * 发送用户即时消息（指定频道发送即时消息），事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param channelId        指定频道的ID作为消息发送目标
     * @param body             支持普通文本消息：isCustom为true时body可以是json形式的自定义报文
     * @param isCustom         是否为自定义消息
     * @param allowOfflineSend 是否允许离线发送
     * @return AirMessage
     */
    @Override
    public AirMessage messageSend(String channelId, String body, boolean isCustom, boolean allowOfflineSend) {
        return airtalkeeMessage.MessageSend(channelId, body, isCustom, allowOfflineSend);
    }

    //========== 语音即时消息的录制并发送 ==========//
    //调用开始录音接口，其他动作会自动结束并抛出相应事件。如用户正在播放一条录音时，
    //此时调用开始录音接口，播放自动停止并抛出播放停止事件，有实时语音并行时也会有同样的处理机制。
    //所以调用方无需关心调用冲突和次序

    /**
     * 开始录音即时消息（开始语音消息录制），事件返回onMessageListener.onMessageRecordStart
     *
     * @param session          指定会话的AirSession对象
     * @param allowOfflineSend 是否允许离线发送
     */
    @Override
    public void messageRecordStart(AirSession session, boolean allowOfflineSend) {
        airtalkeeMessage.MessageRecordStart(session, allowOfflineSend);
    }

    /**
     * 开始录音即时消息（开始语音消息录制），事件返回onMessageListener.onMessageRecordStart
     *
     * @param contact          指定发送目标用户的AirContact实例
     * @param allowOfflineSend 是否允许离线发送
     */
    @Override
    public void messageRecordStart(AirContact contact, boolean allowOfflineSend) {
        airtalkeeMessage.MessageRecordStart(contact, allowOfflineSend);
    }

    /**
     * 开始录音即时消息（开始语音消息录制），事件返回onMessageListener.onMessageRecordStart
     *
     * @param contacts         指定多个发送目标的AirContact实例列表
     * @param allowOfflineSend 是否允许离线发送
     */
    @Override
    public void messageRecordStart(List<AirContact> contacts, boolean allowOfflineSend) {
        airtalkeeMessage.MessageRecordStart(contacts, allowOfflineSend);
    }

    /**
     * 开始录音即时消息（开始语音消息录制），事件返回onMessageListener.onMessageRecordStart
     *
     * @param channel          指定频道ID
     * @param allowOfflineSend 是否允许离线发送
     */
    @Override
    public void messageRecordStart(String channel, boolean allowOfflineSend) {
        airtalkeeMessage.MessageRecordStart(channel, allowOfflineSend);
    }

    /**
     * 重发语音即时消息（重发本地缓存的语音消息）,事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param contact          指定发送目标用户的AirContact实例
     * @param msgCode          预重发的消息Code，来自AirMessage.getMessageCode()
     * @param msgResId         预重发的语音消息资源ID，来自AirMessage.getImageUri()
     * @param msgRecordSeconds 与发送的语音消息时长（单位秒），来自AirMessage.getImageLength（）
     * @param allowOfflineSend 是否允许离线发送
     */
    @Override
    public void messageRecordResend(AirContact contact, String msgCode, String msgResId, int msgRecordSeconds, boolean allowOfflineSend) {
        airtalkeeMessage.MessageRecordResend(contact, msgCode, msgResId, msgRecordSeconds, allowOfflineSend);
    }

    /**
     * 重发语音即时消息（重发本地缓存的语音消息）,事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param contacts         指定发送目标用户的AirContact实例列表
     * @param msgCode          预重发的消息Code，来自AirMessage.getMessageCode()
     * @param msgResId         预重发的语音消息资源ID，来自AirMessage.getImageUri()
     * @param msgRecordSeconds 与发送的语音消息时长（单位秒），来自AirMessage.getImageLength（）
     * @param allowOfflineSend 是否允许离线发送
     */
    @Override
    public void messageRecordResend(List<AirContact> contacts, String msgCode, String msgResId, int msgRecordSeconds, boolean allowOfflineSend) {
        airtalkeeMessage.MessageRecordResend(contacts, msgCode, msgResId, msgRecordSeconds, allowOfflineSend);
    }

    /**
     * 重发语音即时消息（重发本地缓存的语音消息）,事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param channelId        指定目标频道ID
     * @param msgCode          预重发的消息Code，来自AirMessage.getMessageCode()
     * @param msgResId         预重发的语音消息资源ID，来自AirMessage.getImageUri()
     * @param msgRecordSeconds 与发送的语音消息时长（单位秒），来自AirMessage.getImageLength（）
     * @param allowOfflineSend 是否允许离线发送
     */
    @Override
    public void messageRecordResend(String channelId, String msgCode, String msgResId, int msgRecordSeconds, boolean allowOfflineSend) {
        airtalkeeMessage.MessageRecordResend(channelId, msgCode, msgResId, msgRecordSeconds, allowOfflineSend);
    }

    /**
     * 结束或取消语音即时消息录制
     *
     * @param isCancel false为正常结束进行消息发送，true为用户取消刚录制的语音
     */
    @Override
    public void messageRecordStop(boolean isCancel) {
        airtalkeeMessage.MessageRecordStop(isCancel);
    }

    /**
     * 开始播放语音即时消息（开始播放一条指定的语音消息，播放完成后，会自动停止）
     * 事件返回onMessageListener,onMessageRecordPlayStart()
     *
     * @param msgCode  消息Code，来自AirMessage.getMessageCode()
     * @param msgResId 语音消息资源ID，来自AirMessage.getImageURI()
     */
    @Override
    public void messageRecordPlayStart(String msgCode, String msgResId) {
        airtalkeeMessage.MessageRecordPlayStart(msgCode, msgResId);
    }

    /**
     * 开始播放语音即时消息（开始播放一条指定的语音消息，播放完成后，会自动停止）
     * 事件返回onMessageListener,onMessageRecordPlayStart()
     *
     * @param msg 预播放语音消息的AirMessage实例
     */
    @Override
    public void messageRecordPlayStart(AirMessage msg) {
        airtalkeeMessage.MessageRecordPlayStart(msg);
    }

    /**
     * 预加载语音消息数据（用户可在调用MessageRecordPlayStart之前调用此接口，以从网络服务中心预加载语音数据。
     * 此接口并非必须，即使不调用此接口，MessageRecordPlayStart接口也会依据当前状态进行加载。）
     * 事件返回onMessageListener.onMessageRecordPlayLoading和onMessageListener.onMessageRecordPlayLoaded
     *
     * @param msg
     */
    @Override
    public void messageRecordPlayDownload(AirMessage msg) {
        airtalkeeMessage.MessageRecordPlayDownload(msg);
    }

    /**
     * 停止正在播放的语音消息，事件返回onMessageListener.onMessageRecordPlayStop
     */
    @Override
    public void messageRecordPlayStop() {
        airtalkeeMessage.MessageRecordPlayStop();
    }

    /**
     * 清除语音消息本地文件（删除指定语音消息）
     *
     * @param resId 语音消息资源ID
     * @return 是否删除成功
     */
    @Override
    public boolean recordFileClean(String resId) {
        return airtalkeeMessage.RecordFileClean(resId);
    }

    /**
     * 清除语音消息本地文件（删除指定语音消息）
     *
     * @param resIds 语音消息资源ID列表
     * @return 是否删除成功
     */
    @Override
    public boolean recordFileClean(String[] resIds) {
        return airtalkeeMessage.RecordFileClean(resIds);
    }

    /**
     * 清除全部语音消息本地文件（删除全部语音消息）
     *
     * @return 是否删除成功
     */
    @Override
    public boolean recordFileCleanAll() {
        return airtalkeeMessage.RecordFileCleanAll();
    }

    /**
     * 注册监听器，设置本地录制事件回调的实例
     *
     * @param listener 监听器
     */
    public void setOnMessagePttListener(OnMessagePttListener listener) {
        airtalkeeMessage.setOnMessagePttListener(listener);

    }

    public void messageRecordPlayStartLocal(AirMessage msg) {
        airtalkeeMessage.MessageRecordPlayStartLocal(msg);
    }
}
